
/* *
* Promise.all是 JavaScript 中的一个方法，用于处理多个Promise对象。它接收一个可迭代对象（通常是一个包含多个Promise的数组）作为参数。
* 这个方法的主要作用是并行地执行多个异步操作，并在所有的异步操作都完成（即所有Promise都变为fulfilled状态）之后，返回一个新的Promise。
* 新Promise的状态由传入的Promise数组中的状态决定。
* 当所有传入的Promise都fulfilled（成功）时，Promise.all返回的Promise也会fulfilled，并且其结果是一个包含所有传入Promise成功结果的数组，
* 数组的顺序与传入Promise的顺序相同
* 只要有一个传入的Promise被rejected（失败），Promise.all返回的Promise就会立即rejected，并且其rejected的值是第一个被rejected的Promise的值
* 使用场景：同时请求数据或资源
* */
function myPromiseAll(promises) {
    return new Promise((resolve, reject) => {
        //? 该方法的参数需为一个可迭代对象
        if (promises == null || typeof promises[Symbol.iterator] !== "function") {
            throw new TypeError(`${promises} is not a iterable`);
        }
        //? 可迭代对象为空则返回已resolve的promise
        if (promises.length === 0) {
            resolve([]);
        }
        promises = [...promises];
        let count = 0
        const values = []
        promises.forEach((promise,index) => {
            Promise.resolve(promise).then((res) => {
                values[index] = res;
                if (++count === promises.length) resolve(values)
            }, reject)
        })
    })
}

// 示例使用
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.reject("error");
const promise4 = new Promise(resolve => {
    setTimeout(() => {
        resolve(3)
    },2000)
})
const promises = [promise1,promise2,promise3,promise4]
myPromiseAll(promises).then(res => console.log(res),err => console.log(err))
Promise.all(promises).then(res => console.log(res),err => console.log(err))
